import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.awt.*;

/**
 * Clase base de los zombies(enemigos) del juego
 * 
 * @author Andres Tovar Jaime
 * @version 1 30-nov-2012
 */
public class Zombies extends Actor
{
    private Point p; //obejto de la clase punto que sirve para mover a los zombies hacia la posicion del jugador
    private Mundo mundo; //variable de la clase mundo
    protected Jugador juga; //objeto de la clase jugador
    private int x=0,y=0,dir=0; //variable enteras que son coordenadas x y y del mapa y la direccion que se le daran a los zombies
    private int indice=0;
    private Balas bala;
    private SimpleTimer timer=new SimpleTimer(); //contador
    private int vel=0; //velocidad del zombie
    /**
     * Act - do whatever the Zombie wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    public void act() 
    {
        
       if(juga.yaFue()==false)
       {
       p.x = juga.getX();
       p.y = juga.getY();
       x=this.getX();
       y=this.getY();
       vel=((Mundo)getWorld()).dameVelocidad();
       if(indice == 0)
       {
          asignaDir();
          Girar();
       }
       move(1);
       indice = indice==20?0:indice+1;
       
      }
      else
      {
          Greenfoot.stop();
      }
    }  
    
    /**
     * constructor de la clase Zombies 
     */
    public Zombies(Jugador jugador)
    {
        juga=jugador;
        p = new Point();
    }
    
    /**
     * Metodo que segun la direccion en donde esta el jugador gira sobre su eje a los zombies para hacer la ilusion de que siguen al jugador 
     */
    public void Girar()
    {
        switch(dir)
        {
            case 0:
               setRotation(225);
               break;
            case 1:
               setRotation(270);
               break;
            case 2:
               setRotation(315);
               break;
           case 3:
               setRotation(0);
               break;
           case 4:
               setRotation(45);
               break;
           case 5:
               setRotation(90);
               break;
           case 6:
               setRotation(135);
               break;
           case 7:
               setRotation(180);
               break;
           
            
        }
    }
    
    /**
     * En base a la posicion en la que esta el jugador y el zombie cambia la direccion aleatoriamente
     */
    public void asignaDir()
    {
       if(x < p.x)
       {
           if(y < p.y )
               dir = randomDir(8);
           if(y == p.y )
               dir = randomDir(7);
           if(y > p.y )
               dir = randomDir(6);
       }
       if(x == p.x)
       {
           if(y < p.y )
               dir = randomDir(5);
           if(y > p.y )
               dir = randomDir(4);
       }
       if(x > p.x)
       {
           if(y < p.y )
               dir = randomDir(3);
           if(y == p.y )
               dir = randomDir(2);
           if(y > p.y )
               dir = randomDir(1);
       }
    }
    
    
    /**
     * calcula la direccion aleatoria del zombie
     */
    public int randomDir(int i)
    {
        int auxdir =0;
        switch(i)
        {
            case 1:
                 auxdir = Greenfoot.getRandomNumber(3);
                 if(auxdir == 0)
                     return 7;
                 if(auxdir == 1)
                     return 0;
                 if(auxdir == 2)
                     return 1;
                 break;
            case 2:
                 auxdir = Greenfoot.getRandomNumber(3);
                 if(auxdir == 0)
                     return 6;
                 if(auxdir == 1)
                     return 7;
                 if(auxdir == 2)
                     return 0;
                 break;
            case 3:
                 return Greenfoot.getRandomNumber(3)+5;
            case 4:
                 return Greenfoot.getRandomNumber(3);
            case 5:
                 return Greenfoot.getRandomNumber(3)+4;
            case 6:
                 return Greenfoot.getRandomNumber(3)+1;
            case 7:
                 return Greenfoot.getRandomNumber(3)+2;
            case 8:
                    
                 auxdir = Greenfoot.getRandomNumber(3)+3;   
               //  System.out.println(auxdir);
                 return auxdir;
        }
        return auxdir;
    }
    
    /**
     * Checa si el zombie esta en contacto con una bala y determina cuanta vida le baja
     */
     public boolean meDisparo()
    {
        bala=(Balas)getOneIntersectingObject(Balas.class);
        if(bala!=null)
        {
            World mundo=this.getWorld();
            mundo.removeObject(bala);
            return true;
        }
        return false;
    }
}
